package com.example.plantuml.tools;


import org.springframework.util.StringUtils;

/**
 * 包路径转换工具，将配置的包路径转换为合法的AspectJ切入点表达式
 */
public class PackageUtils {

    /**
     * 将包路径列表转换为AspectJ切入点表达式
     * 示例：输入"com.example.controller,com.example.service"
     * 输出"execution(* com.example.controller..*(..)) || execution(* com.example.service..*(..))"
     */
    public static String convertToPointcutExpression(String packages) {
        // 处理空配置
        if (!StringUtils.hasText(packages)) {
            return "execution(* com.example.plantuml.dummy..*(..))"; // 匹配不存在的包，避免全局拦截
        }

        String[] packageArray = packages.split(",");
        StringBuilder expression = new StringBuilder();

        for (int i = 0; i < packageArray.length; i++) {
            String pkg = packageArray[i].trim();
            if (isValidPackage(pkg)) {
                // 添加单个包的切入点表达式
                expression.append("execution(* ").append(pkg).append("..*(..))");

                // 多个包之间添加||分隔符
                if (i < packageArray.length - 1 && isValidPackage(packageArray[i+1].trim())) {
                    expression.append(" || ");
                }
            }
        }

        // 如果所有包都无效，返回默认表达式
        return expression.length() > 0 ? expression.toString() :
                "execution(* com.example.plantuml.dummy..*(..))";
    }

    /**
     * 验证包路径格式是否合法
     */
    private static boolean isValidPackage(String pkg) {
        if (!StringUtils.hasText(pkg)) {
            return false;
        }
        // 简单验证：只允许字母、数字、点和下划线
        return pkg.matches("^[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)*$");
    }
}
